package cn.edu.lcu.cs.javaprogramming.basic;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * <h3>统计成绩，用For循环实现</h3>
 * <ol>
 *     <li>从控制台循环读取84个Java课程的成绩，成绩为0-100之间的整数，如果成绩非法，输入提前结束。</li>
 *     <li>统计各分数段的人数。优、良、中、及格、不及格。</li>
 *     <li>结果打印到控制台。</li>
 * </ol>
 *
 * @author ling
 */
public class StatisticalScores {
    public static void main(String[] args) {
        System.out.println("请输入0-100之间的成绩");
        Scanner scanner = new Scanner(System.in);

        int gradeA = 0;
        int gradeB = 0;
        int gradeC = 0;
        int gradeD = 0;
        int gradeE = 0;

        for (int i = 0; i < 84; i++) {
            int score = 0;
            try {
                // 从控制台读取整型数据
                // 如果用户输入的文本格式有误，文本转整型的解析过程会出错。
                // 一个异常会被抛出，当前程序中止执行，提前退出。
                // 本例中，程序中止执行，提前退出，显然不合理。
                // 应该容忍用户的输入失误（容错），如果输入有误，默默地绕过这个错误，继续解析剩余的输入。
                score = scanner.nextInt();
            } catch (InputMismatchException e) {
                // 捕获异常之后，要么打印栈追踪信息，要么对异常进行容错处理，严格禁止啥也不做！！！

                // 打印异常的基本信息，及异常发生时的栈追踪信息，用于调试纠错。
                //e.printStackTrace();

                // 跳过刚刚引发异常的格式有误的输入，以对下一个输入进行解析。
                scanner.next();

                // 跳过后续的循环体，继续下一轮输入与解析。
                continue;
            }

            if (score < 0 || score > 100) {
                break;
            }

            // 用else if语句多次判断
            //if (score < 60) {
            //    gradeE++;
            //} else if (score < 70) {
            //    gradeD++;
            //} else if (score < 80) {
            //    gradeC++;
            //} else if (score < 90) {
            //    gradeB++;
            //} else {
            //    gradeA++;
            //}

            // 本例比较特殊，也可用Switch语句实现
            switch (score / 10) {
                case 10:
                case 9:
                    gradeA++;
                    break;
                case 8:
                    gradeB++;
                    break;
                case 7:
                    gradeC++;
                    break;
                case 6:
                    gradeD++;
                    break;
                default:
                    gradeE++;
                    break;
            }

            //也可用Java12中引入的增强Switch语法实现
            /*
            switch (score / 10) {
                case 10, 9 -> gradeA++;
                case 8 -> gradeB++;
                case 7 -> gradeC++;
                case 6 -> gradeD++;
                default -> gradeE++;
            }
            */

        }

        System.out.printf("优%d人，良%d人，中%d人，差%d人，不及格%d人", gradeA, gradeB, gradeC, gradeD, gradeE);

    }
}